#pragma once



//#include "../common/base.h"
#include "../common/commDef.h"
#include "rtdb_sys.h"

 
 /**************
 功能：打开数据库
 **************/
bool OpenDbms(); 
void CloseDbms();   

bool IsLoadDbms(); 

//int  get_rtdb_Version();
//bool set_rtdb_version( unsigned int ver );

 /**************
 功能：装载实时库文件
 参数： lib_no指实时库表号， < 256
        lib_no==-1 装载所有实时库, lib_no > 0 装载指定实时库表
 返回值: 成功true  失败false		
 **************/
bool LoadRtdb(int lib_no= -1);

 /**************
 功能：保存实时库文件
 参数： lib_no指实时库表号， < 256
        lib_no==-1 保存所有实时库, lib_no > 0 保存指定实时库表
 返回值: 成功true  失败false		
 **************/
void SaveRtdb(int lib_no= -1);

 /**************
 功能：创建实时库表
 参数： rdb_name 实时库表名称
		lib_no   实时库表号,    0 < lib_no < 256
        rec_num  创建实时库表时,  记录最大记录
		rec_width 每条记录的长度
 返回值: 成功true  失败false		
 **************/
bool CreateRTdb(char * rdb_name, unsigned char lib_no, int rec_num, unsigned short rec_width);

 /**************
 功能：判断当前实时库表是否有效
 参数： lib_no指实时库表号， 
 返回值: 成功true  失败false		
 **************/
bool IsLibNoValid(short TheLibNo);

 /**************
 功能：打开指定的实时库表
 参数： lib_no指实时库表号， 
 返回值: tHandle 返回的库表号句柄	
 **************/
tHandle OpenLib(int lib_no);

 /**************
 功能： 判断句柄是否有效
 参数： TheHandle 是 实时库表的句柄 
 返回值: 成功true  失败false		
 **************/
bool IsHandleValid(const tHandle& TheHandle) ;

 /**************
 功能： 读取指定实时库表的第一条记录
 参数： handle 是实时库表的句柄 
        ReadBuf  指读取实时库表的结构buf
		buf_len  指所读取的实时库表记录的结构大小
 返回值: 成功true  失败false		
 **************/
bool ReadFirst(tHandle & handle, char * ReadBuf, unsigned short buf_len);

 /**************
 功能： 读取指定实时库表的下一条记录
 参数： handle 是实时库表的句柄 
        ReadBuf  指读取实时库表的结构buf
		buf_len  指所读取的实时库表记录的结构大小
 返回值: 成功true  失败false		
 **************/
bool ReadNext(tHandle & handle, char * ReadBuf, unsigned short buf_len);

/**************
 功能： 更新实时库表
 参数： handle 是实时库表的句柄 
		ReadBuf  指读取实时库表的结构buf
		buf_len  指所读取的实时库表记录的结构大小
 返回值: 成功true  失败false		
 **************/
bool UpdateRecByHandle(tHandle & handle, char * ReadBuf, unsigned short buf_len);

 /**************
 功能： 关闭实时库表
 参数： handle 是实时库表的句柄 
 返回值: 成功true  失败false		
 **************/
void CloseLib(tHandle & handle); 
 

 /**************
 功能： 向指定的实时库表中插入记录
 参数： TheLibNo 实时库表号
        Key_id   每条记录的索引KEY值
		ReadBuf  指保存实时库表的结构buf
		rec_len  指所保存的实时库表记录的结构大小
 返回值: 成功true  失败false		
 **************/
bool InsertRec(int TheLibNo, DIC_INT64 Key_id, char* RecBuf, unsigned short rec_len);

 /**************
 功能： 向指定的实时库表中更新记录, 如果Key_id不存在, 则更新失败
 参数： TheLibNo 实时库表号
        Key_id   每条记录的索引KEY值
		ReadBuf  指保存实时库表的结构buf
		rec_len  指所保存的实时库表记录的结构大小
 返回值: 成功true  失败false		
 **************/
bool UpdateRec(int TheLibNo, DIC_INT64 Key_id, char* RecBuf, unsigned short rec_len);

 /**************
 功能： 向指定的实时库表中更新记录, 如果Key_id不存在,则将此记录插入指定的实时库表中
 参数： TheLibNo 实时库表号
        Key_id   每条记录的索引KEY值
		ReadBuf  指定实时库表的结构buf
		rec_len  指定实时库表记录的结构大小
 返回值: 成功true  失败false		
 **************/
bool UpdateRec_Ex(int TheLibNo, DIC_INT64 Key_id, char* RecBuf, unsigned short rec_len);

 /**************
 功能： 根据key_id,快速定位指定实时库表中记录. 返回的ReadBuf 是对实时库表中记录复制buf.
 参数： TheLibNo 实时库表号
        Key_id   每条记录的索引KEY值
		ReadBuf  指定实时库表的结构buf
		rec_len  指定实时库表记录的结构大小
 返回值: 成功true  失败false		
 **************/
bool FindRec(int TheLibNo, DIC_INT64 Key_id, char* RecBuf, unsigned short rec_len);

 /**************
 功能： 根据key_id,快速定位指定实时库表中记录.  
 参数： TheLibNo 实时库表号
        Key_id   每条记录的索引KEY值 
 返回值: 返回指定TheLibNo实时库表的记录, 此记录是直接定位到内存地址. 可直接修改内存记录值		
 **************/
char * FindRecEx(int TheLibNo, DIC_INT64 Key_id);

 /**************
 功能： 根据key_id,删除实时库表中记录.  
 参数： TheLibNo 实时库表号
        Key_id   每条记录的索引KEY值 
 返回值: 成功true  失败false
 **************/
bool  Delete_key( int TheLibNo, DIC_INT64 Key_id );

 /**************
 功能： 计算字符串转换成一个KEY值.  
 参数： TheLibNo 实时库表号
        rec_name 需计算的字符串
		rec_len  字段串名称
 返回值: 返回一个字符串的hash的key值
 **************/
int HashGetRecKey(int TheLibNo, char * rec_name, int rec_len);

/**************
 功能： 获取指定实时库表的记录库最大记录空间
 参数： TheLibNo 实时库表号 
 返回值: 返回实时库表大小
 **************/
int  GetLibSize(int TheLibNo) ;

/**************
 功能： 获取指定实时库表的记录实际条数
 参数： TheLibNo 实时库表号 
 返回值: 返回记录条数
 **************/
int  GetRecCount(int TheLibNo) ;

/**************
 功能： 获取指定实时库表的一条记录的长度
 参数： TheLibNo 实时库表号 
 返回值: 返回一条记录的长度
 **************/
unsigned short  GetRecWidth(int TheLibNo);

/**************
 功能： 清空指定的实时库表
 参数： TheLibNo 实时库表号 
 返回值:  
 **************/
void  EmptyLib(int TheLibNo);  

/**************
 功能： 清空所有的实时库表
 参数：  
 返回值:  
 **************/
void EmptyAll() ;

/**************
 功能： 检查lib_no的库表号，是否被占用
 参数：  TheLibNo 实时库表号 
 返回值:  成功true  失败false	
 **************/ 
bool CheckCanBeUsedByLibNo( int lib_no );


int SearchRecOrder(int TheLibNo, DIC_INT64 Key_id, int & EmptyOrder); 
tHandle  GetInvalidHandle();  
bool LoadLibFile(char  * TheFileName, short TheLibNo);
bool SaveLibFile(char  * TheFileName, short TheLibNo);
int HashCode(char* TheBuff, short BuffWidth, int BaseVol) ;

void DestroyLib(short TheLibNo) ;
bool IfUsed_libno(short TheLibNo);
bool SaveLibToMem(short TheLibNo, char  * pBuff, long BuffSize);
long  GetLoad_SaveBuffSize(short TheLibNo);
bool  LoadLibFromMem(short TheLibNo, char* pBuff, long BuffSize);
int  GetCompleteRecWidth(int TheLibNo);   

/*************************************************************************************
               
			   下面接口是针对KEY值是字符串的接口
			   
			   ** 1,string_key 不能大于64个字节
			   ** 2, TheLibNo对应的库,仍然可以用上面的接口
*************************************************************************************/

bool InsertRec_stringkey( int TheLibNo, char * string_key, char* RecBuf, unsigned short rec_len);
bool UpdateRec_stringkey( int TheLibNo, char * string_key, char* RecBuf, unsigned short rec_len);
bool UpdateRec_stringkey_Ex( int TheLibNo, char * string_key, char* RecBuf, unsigned short rec_len);
char * FindRec_stringkey(int TheLibNo, char * string_key);
bool  Delete_key( int TheLibNo, char * string_key );
